﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Com.Binaria.SISCOB.DTO;
using System.IO;
using System.Collections;
using System.Globalization;
using Com.Binaria.Core.Exceptions;
using Com.Binaria.Core;
using System.Diagnostics;

namespace Com.Binaria.SISCOB.Mgr
{
    public class ImportarRC2 : IImportarRC
    {
        #region Miembros de IImportarRC

        public RegistroContableDTO[] Cargar(string fileDir)
        {
            FileInfo oFile = new FileInfo(fileDir);
            return getDocumentos(oFile);
        }

        #endregion

        #region METODOS PROPIOS DE LA IMPLEMENTACION

        RegistroContableDTO[] getDocumentos(FileInfo oFile)
        {
            string[] aValues = null;
            string[] aLines = File.ReadAllLines(oFile.FullName);
            //
            CartolaMayorDTO oDTO = new CartolaMayorDTO();
            //Preparar: Documento
            oDTO = new CartolaMayorDTO();
            //oDTO.FchEmision = getFecha(string.Format("{0} {1}", aLines[0].Split(';')[11].Substring(7)
            //                                                        , aLines[1].Split(';')[11].Substring(6)
            //                                                        ));
            aValues = aLines[1].Split(';');
            oDTO.CuentaCorriente = new CuentaCorrienteDTO();
            oDTO.CuentaCorriente.NmrCuenta = getCta(getValue(aValues[1]));
            oDTO.CuentaCorriente.Descripcion = getValue(aValues[2]);
            oDTO.CuentaCorriente.EstaActivo = true;

            aValues = aLines[2].Split(';');
            oDTO.FchDesde = getFecha(getValue(aValues[1]));
            oDTO.FchHasta = getFecha(getValue(aValues[2]));
            oDTO.FchEmision = oDTO.FchDesde;

            //Preparar: Items
            ArrayList oLst = new ArrayList(16);
            long totMonto = 0;
            for (int i = 6; i < aLines.Length; i++)
            {
                aValues = aLines[i].Split(';');
                if (aValues[0].Trim().Length < 1) continue;
                //
                RegistroContableDTO oItem = new RegistroContableDTO();
                oItem.CartolaMayor = oDTO;
                oItem.FchRegistro = getFecha(getValue(aValues[0]));
                oItem.Glosa = getValue(aValues[2]).ToUpper();
                //oItem.NmrAsiento = getValue(aValues[2]);
                oItem.NmrDcto = getValue(aValues[1]);
                oItem.EstaProcesado = false;
                //
                long lMonto = getMonto(getValue(aValues[3]));
                if (lMonto != 0)
                {
                    oItem.Monto = lMonto;
                    oItem.Tipo = "I";
                }
                lMonto = getMonto(getValue(aValues[4]));
                if (lMonto != 0)
                {
                    oItem.Monto = lMonto;
                    oItem.Tipo = "E";
                }
                totMonto += (long)oItem.Monto;
                //
                oLst.Add(oItem);
            }
            //
            return (RegistroContableDTO[])oLst.ToArray(typeof(RegistroContableDTO));
        }

        #endregion

        #region METODOS DE USO INTERNO

        private string getCta(string valor)
        {
            return Convert.ToInt32(valor).ToString("000-0-000000-0");
        }

        DateTime? getFecha(string valor)
        {
            DateTime? oResult = null;
            //
            string[] aValues = valor.Split(new char[] { '-', '/' }, StringSplitOptions.RemoveEmptyEntries);
            //
            if (aValues.Length > 3)
                oResult = Convert.ToDateTime(
                        string.Format("{1}{0}{2}{0}{3} {4}",
                                          CultureInfo.CurrentCulture.DateTimeFormat.DateSeparator
                                        , aValues[0]
                                        , aValues[1]
                                        , getValue(aValues[2])
                                        , getValue(aValues[3]))
                                      );
            else if (aValues.Length == 3)
                oResult = Convert.ToDateTime(
                        string.Format("{1}{0}{2}{0}{3}",
                                          CultureInfo.CurrentCulture.DateTimeFormat.DateSeparator
                                        , aValues[0]
                                        , aValues[1]
                                        , getValue(aValues[2]))
                                      );
            //
            return oResult;
        }

        long getMonto(string valor)
        {
            long oResult = 0;
            //
            oResult = Convert.ToInt64(valor.Replace(".", string.Empty));
            //
            return oResult;
        }

        string getValue(string valor)
        {
            if (string.IsNullOrEmpty(valor)) return valor;
            //
            if (!Char.IsLetterOrDigit(valor[0]) && valor.Length > 2)
                return valor.Substring(1).Trim();
            else if (!Char.IsLetterOrDigit(valor[valor.Length - 1]))
                return valor.Remove(valor.Length - 1).Trim();
            //
            return valor;
        }

        #endregion
    }
}
